package com.newtouch.bxzs.business.product.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.newtouch.bxzs.business.product.model.*;
import com.newtouch.bxzs.common.base.model.Product;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 产品的mapper类，必须继承BaseMapper
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2020/12/31 15:43</td>
 * <td>xiongdianqiang</td>
 * <td>Create</td>
 * </tr>
 * </table>
 *
 * @author xiongdianqiang
 * @version 1.0.0
 * @since 1.0.0
 */
@Mapper
public interface ProductMapper extends BaseMapper<Product> {

    /**
     * 查看产品佣金比例列表
     *
     * @param page 分页参数
     * @return IPage<ProductCommissionRateBO>
     */
    IPage<ProductCommissionRateBO> getProductCommissionRateList(@Param("page") Page<ProductCommissionRateBO> page);

    /**
     * App查看产品列表
     *
     * @param page         分页参数
     * @param productAppVO App查看产品列表VO
     * @return IPage<ProductOnAppBO>
     */
    IPage<ProductOnAppBO> getProductOnApp(@Param("page") Page<ProductOnAppBO> page, @Param("productAppVO") ProductAppVO productAppVO);

    /**
     * App查看产品营销话术列表按分页
     *
     * @param page         分页参数
     * @param productAppVO App查看产品营销话术列表按分页VO
     * @return IPage<ProductMarketingDiscourseBO>
     */
    IPage<ProductMarketingDiscourseBO> getProductMarketingDiscourseList(@Param("page") Page<ProductMarketingDiscourseBO> page, @Param("productAppVO") ProductAppVO productAppVO);

    /**
     * 根据合作公司查看产品
     *
     * @param page             分页参数
     * @param productCompanyVO 根据合作公司查看产品VO
     * @return IPage<ProductOnAppBO>
     */
    IPage<ProductOnAppBO> getProductListByCompany(@Param("page") Page<ProductOnAppBO> page, @Param("productCompanyVO") ProductCompanyVO productCompanyVO);

    /**
     * 按照产品名称排序查看产品列表
     *
     * @param productName 产品名称
     * @return List<ProductMarketingBO>
     */
    List<ProductMarketingBO> getProductListByMarketing(@Param("productName") String productName);

    /**
     * 展示产品地区排名
     *
     * @param productRegionRankingVO 展示产品地区排名VO
     * @param rankingNumber          排名限制查询数
     * @return List<ProductRegionRankingBO>
     */
    List<ProductRegionRankingBO> getProductRegionRankingList(@Param("productRegionRankingVO") ProductRegionRankingVO productRegionRankingVO, @Param("rankingNumber") Integer rankingNumber);

    /**
     * 查看地区
     *
     * @param regionCode 地区编码
     * @return 地区名称
     */
    @Select("select region.REGION_NAME from ASSISTANT_REGION as region where region.REGION_CODE=#{regionCode}")
    String getRegionName(@Param("regionCode") String regionCode);

    /**
     * 查看产品排名
     *
     * @param productRegionRankingVO 查看产品排名VO
     * @param productCode            产品编码
     * @return ProductRegionRankingBO
     */
    ProductRegionRankingBO getProductRegionRanking(@Param("productRegionRankingVO") ProductRegionRankingVO productRegionRankingVO, @Param("productCode") String productCode);

    /**
     * 查看产品地区排名时查看产品列表
     *
     * @param productType 产品类型
     * @param regionCode  地区编码
     * @param dataSource  数据来源
     * @return RankingProductBO集合
     */
    @Select("SELECT DISTINCT\n" +
            "\tproduct.PRODUCT_CODE,\n" +
            "\tproduct.PRODUCT_NAME \n" +
            "FROM\n" +
            "\tASSISTANT_PRODUCT_SALES_STATISTICS AS sale\n" +
            "\tLEFT JOIN ASSISTANT_PRODUCT AS product ON sale.PRODUCT_CODE = product.PRODUCT_CODE \n" +
            "WHERE\n" +
            "\t(case when #{regionCode} is not null and #{regionCode} != ''  then (sale.REGION_CODE = #{regionCode}) else 1=1 end) and\n" +
            "\t(case when #{dataSource} is not null and #{dataSource} != ''  then (sale.DATA_SOURCE = #{dataSource}) else 1=1 end) and\n" +
            "\t(case when #{productType} is not null and #{productType} != ''  then (product.PRODUCT_TYPE = #{productType}) else 1=1 end)\n")
    List<RankingProductBO> getProductRankingList(@Param("productType") String productType, @Param("regionCode") String regionCode, @Param("dataSource") String dataSource);

}

